/**
 * 类型管理
 * 
 * @author XiongChun
 * @since 2010-02-13
 */
Ext.onReady(function() 
	{
	var root = new Ext.tree.AsyncTreeNode({
		//在js中定义的变量他的值是request作用域中的值，属性名是rootMenuname
		text : root_menuname,
		expanded : true,
		//指定当前根节点的编号！
		id : '010201'
	});
	//动态加载树，当数下的菜单还是目录时继续加载，一直记在到叶子，有点类适与递归调用！
var menuTree = new Ext.tree.TreePanel({
		loader : new Ext.tree.TreeLoader({
					baseAttrs : {},
					dataUrl : './szglDemo.ered?reqCode=queryMenuItems'
				}),
		root : root,
		title : '',
		//树形菜单将要渲染的层！
		applyTo : 'menuTreeDiv',
		autoScroll : false,
		animate : false,
		useArrows : false,
		border : false
	});
//每次菜单被点击就会触发事件，用于加载这个类型下的当前项目的附件信息！
	menuTree.on('click', function(node) 
			{
				moder='save';
				//菜单的编号和菜单名字！
				menuid = node.attributes.id;
				menuname = node.attributes.text;
				//这一步代码非常关键，当时叶子时才允许添加，否则不允许！
				if(node.leaf)
				{
					Ext.getCmp('add').enable();
					//其实就是录入和修改界面中的父菜单的名字，这个控件中的值是不可以手动修改的，仅仅对用户来说是只读的！
					//Ext.getCmp('parentmenuname').setValue(menuname);
					//同时设置父菜单的编号，因为保存和修改时是通过编号来操作的，名字只是给用户看的!
					//Ext.getCmp('parentid').setValue(menuid);
					store.load({
								params : 
								{
									start : 0,
									limit : bbar.pageSize,
									//无论点击的是节点还是菜单都会触发查询，但是传递过去的参数是不一样的；
									menuid : menuid
								},//设定回调函数名！
								callback :totals
							});
					//结束程序！
					return;
				}
				//如果仅仅用单纯的if else对是不能把点击加号排除了，因此必须这样价格else if,即既不是叶子也不是节点
				else if(!node.leaf)
				{
					Ext.getCmp('add').disable();
					//其实就是录入和修改界面中的父菜单的名字，这个控件中的值是不可以手动修改的，仅仅对用户来说是只读的！
					//Ext.getCmp('parentmenuname').setValue(menuname);
					//同时设置父菜单的编号，因为保存和修改时是通过编号来操作的，名字只是给用户看的!
					//Ext.getCmp('parentid').setValue(menuid);
					store.load({
								params : 
								{
									start : 0,
									limit : bbar.pageSize,
									//每次点击菜单都会讲当前被点击的菜单的编号传递到后台！
									parentid : menuid
								},//设定回调函数名！
								callback :totals
							});
				}
				else
				{
					Ext.getCmp('add').disable();
					//其实就是录入和修改界面中的父菜单的名字，这个控件中的值是不可以手动修改的，仅仅对用户来说是只读的！
					//Ext.getCmp('parentmenuname').setValue(menuname);
					//同时设置父菜单的编号，因为保存和修改时是通过编号来操作的，名字只是给用户看的!
					//Ext.getCmp('parentid').setValue(menuid);
					store.load({
								params : 
								{
									start : 0,
									limit : bbar.pageSize,
									//每次点击菜单都会讲当前被点击的菜单的编号传递到后台！
									parentid : menuid
								},//设定回调函数名！
								callback :totals
							});
				}
			});
	menuTree.root.select();
	//定义一个方法调用标识！
	var moder='save';
	//定义一个最初的标题！
	var oldTitle='<span style="font-weight:normal;">项目编号为：'+prj_no+'的收支信息表</span>';
	//
	var sm = new Ext.grid.CheckboxSelectionModel();
	var cm = new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(), sm, 
		                       	        {
		                       				header : '项目编号',
		                       				dataIndex : 'prj_sn',
		                       				hidden:true,
		                       				width : 200
		                       			},
		                       			{
		                       				header : '费用类型编号',
		                       				dataIndex : 'derail_tp',
		                       				sortable : true,
		                       				hidden:true,
		                       				width : 130
		                       			},
		                       	         {
		                       				header : '明细编号',
		                       				dataIndex : 'detail_sn',
		                       				sortable : true,
		                       				//hidden:true,
		                       				width : 130
		                       			},
		                       			{
		                       				header : '收支类型',
		                       				dataIndex : 'tp_name',
		                       				width : 130
		                       			}, {
		                       				header : '金额',
		                       				dataIndex : 'detail_money',
		                       				sortable : true,
		                       				renderer:function(value)
		                       				{
		                       					if(value==null||value==' '||value=='')
		                       					{
		                       						return "<span style='color:red;'>提示：当前没有金额。。。</span>";
		                       					}
		                       					else
		                       					{
		                       						return "<span style='color:red;'>"+value+"元</span>";
		                       					}
		                       				},
		                       				width : 200
		                       			}, {
		                       				header : '备注',
		                       				dataIndex : 'detail_mark',
		                       			//这个属性的值就是一个方法， 我们可以在展示数据的同时修饰数据！
		                       				renderer:function(value)
		                       				{
		                       					if(value==null||value==' '||value=='')
		                       					{
		                       						return "<span style='color:red;'>提示：当前没有备注。。。</span>";
		                       					}
		                       					else
		                       					{
		                       						return value;
		                       					}
		                       				},
		                       				width : 50
		                       			}, {
		                       				header : '款项阶段',
		                       				dataIndex : 'detail_stage',
		                       				sortable : true,
		                       				width : 130
		                       			}, {
		                       				header : '收支时间',
		                       				sortable : true,
		                       				dataIndex : 'detail_date'
		                       			}]);
		/**
		 * 数据存储
		 */
		var store = new Ext.data.Store({
			proxy : new Ext.data.HttpProxy({
						url : './szglDemo.ered?reqCode=shouZhiLook'
					}),
			reader : new Ext.data.JsonReader({
						totalProperty : 'TOTALCOUNT',
						root : 'ROOT'
					}, [{
								name : 'prj_sn'
							}, {
								name : 'detail_sn'
							}, 
							{
								name :'derail_tp'
							}
							,{
								name : 'tp_name'
							}
							,{
								name : 'detail_money'
							}, {
								name : 'detail_mark'
							}, {
								name : 'detail_stage'
							}, {
								name : 'detail_date'
							}])
		});



	// 翻页排序时带上查询条件，这里主要定义了每次查询必须要提交的条件参数！
	store.on('beforeload', function() 
			{
				this.baseParams = 
				{
					//每次在重新加载数据时都会将查询条件带上！
					queryParam : Ext.getCmp('queryParam').getValue()
				};
			});

	var pagesize_combo = new Ext.form.ComboBox({
				name : 'pagesize',
				triggerAction : 'all',
				mode : 'local',
				store : new Ext.data.ArrayStore({
							fields : ['value', 'text'],
							data : [[10, '10条/页'], [20, '20条/页'],
									[50, '50条/页'], [100, '100条/页'],
									[250, '250条/页'], [500, '500条/页']]
						}),
				valueField : 'value',
				displayField : 'text',
				value : '20',
				editable : false,
				width : 85
			});
	var number = parseInt(pagesize_combo.getValue());
	pagesize_combo.on("select", function(comboBox) 
			{
				bbar.pageSize = parseInt(comboBox.getValue());
				number = parseInt(comboBox.getValue());
				store.reload({
							params : 
							{
								start : 0,
								limit : bbar.pageSize
							}
						});
			});

	
	// 分页工具栏
	var bbar = new Ext.PagingToolbar({
				pageSize : number,
				store : store,
				displayInfo : true,
				displayMsg : '显示{0}条到{1}条,共{2}条',
				plugins : new Ext.ux.ProgressBarPager(), // 分页进度条
				emptyMsg : "没有符合条件的记录",
				items : ['-', '&nbsp;&nbsp;', pagesize_combo, '-'
				]
			});

	
	var grid = new Ext.grid.GridPanel({
				id :'biaoge',
				title : '<span style="font-weight:normal;">项目编号为：'+prj_no+'的收支信息表</span>',
				//iconCls : 'application_view_listIcon',
				height : 450,
				// width:600,
				autoScroll : true,
				frame : true,
				region : 'center',
				store : store,
				stripeRows : true, // 斑马线
				cm : cm,
				sm : sm,
				bbar : bbar,
				loadMask : {
					msg : '正在加载表格数据,请稍等...'
				},
				viewConfig : {
					// 不产横向生滚动条, 各列自动扩展自动压缩, 适用于列数比较少的情况
								 forceFit : true
								},
				tbar : [{
							text : '新增收支',
							id:'add',
							iconCls : 'page_addIcon',
							disabled : true,
							handler : function() {
								moder='save';
								addInit();
							}
						}, '-', {
							text : '修改收支',
							disabled : true,
							iconCls : 'page_edit_1Icon',
							id:'update',
							handler : function() 
							{
								moder='update';
								editInit();
							}
						}, '-', {
							text : '删除收支',
							id:'delete',
							iconCls : 'page_delIcon',
							disabled : true,
							handler : function() 
							{
								deleteFJ();
							}
						}, '->', 
						//下面定义了一个控件，用于接收查询条件：文件名；  控件的id就是很多地方需要引用的queryParam
						new Ext.form.TextField({
									id : 'queryParam',
									name : 'queryParam',
									emptyText : '请输入阶段名称',
									//允许控件触发键盘事件，其实就是方便可以提交，直接按回车也可以提交！
									enableKeyEvents : true,
									//键盘事件的回调方法！
									listeners : {
										specialkey : function(field, e) {
											if (e.getKey() == Ext.EventObject.ENTER) 
											{
												//如果触发的是回车就直接提交！
												queryMenuItem();
											}
										}
									},
									width : 130
								}), {
							text : '查询',
							iconCls : 'previewIcon',
							handler : function() {
								queryMenuItem();
								//由于查询后数据刷新没哟任何数据获得焦点，因此不允许删除和更新操作！
								Ext.getCmp('delete').disable();
								Ext.getCmp('update').disable();
							}
						}, '-', {
							text : '刷新',
							iconCls : 'arrow_refreshIcon',
							handler : function() {
								//刷新时也是没有焦点因此不允许操作！
								Ext.getCmp('delete').disable();
								Ext.getCmp('update').disable();
								store.reload();
							}
						}]
			});
	
	//加载一次，其实就是初始化！
	store.load({
				params : {
					start : 0,
					limit : bbar.pageSize
				}
			});
	// 监听行选中事件
	grid.on('rowclick', function(pGrid, rowIndex, event) {
		//单击行事件将导致更新和删除按钮可用！
				Ext.getCmp('delete').enable();
				Ext.getCmp('update').enable();
			});
	//双击表格中的记录代表的就是要修改附件的信息！
	grid.on('rowdblclick', function(grid, rowIndex, event) {
				editInit();
				moder='update';
			});
	
	
	
	addMenuFormPanel = new Ext.form.FormPanel({
		id : 'addMenuFormPanel',
		name : 'addMenuFormPanel',
		defaultType : 'textfield',
		labelAlign : 'right',
		labelWidth : 65,
		frame : false,
		bodyStyle : 'padding:5 5 0',
		items : [ {
					fieldLabel : '类型名',
					id : 'fjtypeName',
					allowBlank : true,
					readOnly:true,
					anchor : '99%'
				},
				{
					fieldLabel : '类型编号',
					id : 'attc_tp',
					name:'derail_tp',
					allowBlank : false,
					readOnly:true,
					anchor : '99%'
				}
				,
				{
					fieldLabel : '金额',
					name:'detail_money',
					maxLength:10,
					xtype : 'numberfield', // 设置为数字输入框类型
					allowDecimals : true, // 是否允许输入小数
					allowNegative : false, // 是否允许输入负数
					allowBlank : false, // 是否允许为空
					anchor : '99%'
				},new Ext.form.ComboBox({
					id :'stage',
					hiddenName : 'detail_stage',
					allowBlank : false, // 是否允许为空
					fieldLabel : '款项阶段',
					triggerAction : 'all',
					emptyText : '请选择',
					store : new Ext.data.SimpleStore({
								fields : ['name', 'code'],
								data : [['前期', '前期'],
										['设计', '设计'],
										['招投标', '招投标'],
										['施工', '施工']]
							}),
					displayField : 'name',
					valueField : 'code',
					mode : 'local',
					forceSelection : true, // 选中内容必须为下拉列表的子项
					editable : false,
					typeAhead : true,
					resizable : true,
					anchor : '99%'
				}),
				{
					fieldLabel : '备注',
					xtype:'textarea',
					maxLength:400,
					name : 'detail_mark',
					allowBlank : true,
					anchor : '99%'
				},
				{
					xtype : 'datefield',
					fieldLabel : '收支时间', // 标签
					name : 'detail_date', // name:后台根据此name属性取值
					format : 'Y-m-d', // 日期格式化
					value : new Date(),
					anchor : '99%' // 宽度百分比
				}]
	});
	
addMenuWindow = new Ext.Window({
		layout : 'fit',
		width : 420,
		height : 285,
		resizable : false,
		draggable : true,
		closeAction : 'hide',
		title : '<span class="commoncss">新增收支</span>',
		// iconCls : 'page_addIcon',
		modal : true,
		collapsible : true,
		titleCollapse : true,
		maximizable : false,
		buttonAlign : 'right',
		border : false,
		animCollapse : true,
		pageY : 20,
		pageX : document.body.clientWidth / 2 - 420 / 2,
		animateTarget : Ext.getBody(),
		constrain : true,
		items : [addMenuFormPanel],
		buttons : [{
			text : '保存',
			iconCls : 'acceptIcon',
			handler : function() {
				if (runMode == '0') 
				{
					Ext.Msg.alert('提示',
							'系统正处于演示模式下运行,您的操作被取消!该模式下只能进行查询操作!');
					return;
				}
				//用于一个变量来标识到底调用哪个方法可以使代码复用！
				if(moder=='save')
				{
					saveMenuItem();
				}
				else if(moder=='update')
				{
					update();
				}
			}
		}, {
			text : '重置',
			id : 'btnReset',
			iconCls : 'tbar_synchronizeIcon',
			handler : function() {
				clearForm(addMenuFormPanel.getForm());
			}
		}, {
			text : '关闭',
			iconCls : 'deleteIcon',
			handler : function() {
				addMenuFormPanel.getForm().reset();
				addMenuWindow.hide();
			}
		}]
	});
	/**
	 * 布局
	 */
	var viewport = new Ext.Viewport({
				layout : 'border',
				items : [{
							title : '<span class="commoncss">请选择收支类型</span>',
							iconCls : 'layout_contentIcon',
							tools : [{
										id : 'refresh',
										handler : function() {
											menuTree.root.reload();
											Ext.getCmp('add').disable();
										}
									}],
							collapsible : true,
							width : 210,
							minSize : 160,
							maxSize : 280,
							split : true,
							region : 'west',
							autoScroll : true,
							items : [menuTree]
						}, {
							region : 'center',
							layout : 'fit',
							border : false,
							items : [grid]
						}]
			});
	/**
	 * 保存菜单数据
	 */
	function saveMenuItem() {
		if (!addMenuFormPanel.form.isValid()) 
		{
			return;
		}
		addMenuFormPanel.form.submit({
					url : './szglDemo.ered?reqCode=saveShouZhi',
					waitTitle : '提示',
					method : 'POST',
					waitMsg : '正在处理数据,请稍候...',
					success : 
						function(form, action) 
						{
						Ext.MessageBox.alert('提示', action.result.msg);
						Ext.Msg.confirm('请确认', '新增成功,您要继续新的收支吗?', function(
								btn, text) {
							if (btn == 'yes') {
								addMenuFormPanel.getForm().reset();
								store.reload();
								addMenuWindow.show();
								//重新统计！
								totals();
							} 
							else 
							{
								addMenuFormPanel.getForm().reset();
								addMenuWindow.hide();
								store.reload();
								//重新统计！
								totals();
							}
						}); 
					},
					failure : 
						function(form, action) 
					{
						var msg = action.result.msg;
						Ext.MessageBox.alert('提示', '菜单数据保存失败:<br>' + msg);
					}
				});
	}

	/**
	 * 刷新指定节点
	 */
	function refreshNode(nodeid) 
	{
		var node = menuTree.getNodeById(nodeid);
		/* 异步加载树在没有展开节点之前是获取不到对应节点对象的 */
		if (Ext.isEmpty(node)) 
		{
			menuTree.root.reload();
			return;
		}
		if (node.attributes.leaf) 
		{
			//如果指向的是叶子就刷新叶子的父节点！
			node.parentNode.reload();
		} else {
			node.reload();
		}
	}

	/**
	 * 根据条件查询菜单
	 */
	function queryMenuItem() {
		var selectModel = menuTree.getSelectionModel();
		var selectNode = selectModel.getSelectedNode();
		if (Ext.isEmpty(selectNode)) 
		{
			Ext.Msg.alert('提示', '当前没有选中任何节点!');
			return;
		} 
		if(selectNode.leaf)
		{
				store.load({
					params : {
						start : 0,
						limit : bbar.pageSize,
						queryParam : Ext.getCmp('queryParam').getValue(),
						menuid : selectNode.id
					},//设定回调函数名！
					callback :totals
				});
		}
		else
		{
			store.load({
				params : {
					start : 0,
					limit : bbar.pageSize,
					queryParam : Ext.getCmp('queryParam').getValue(),
					parentid : selectNode.id
				},
				callback:totals
			});
		}
	}

	/**
	 * 删除菜单
	 */
	function deleteFJ() {
		if (runMode == '0') {
			Ext.Msg.alert('提示', '系统正处于演示模式下运行,您的操作被取消!该模式下只能进行查询操作!');
			return;
		}
		var rows = grid.getSelectionModel().getSelections();
		if (Ext.isEmpty(rows)) {
			Ext.Msg.alert('提示', '请先选中要删除的文件!');
			return;
		}
		//将要删除的附件编号字符串传递过去！
		var strChecked = jsArray2JsString(rows, 'detail_sn');
		Ext.Msg.confirm('请确认', '你真的要删除所有选中的文件吗?', function(btn, text) {
			if (btn == 'yes') {
				showWaitMsg();
				Ext.Ajax.request({
					url : 'szglDemo.ered?reqCode=deleteShouZhi',
					success : function(response) {
						var resultArray = Ext.util.JSON
								.decode(response.responseText);
						Ext.Msg.alert('提示', resultArray.msg);
						store.reload();
						//重新统计！
						totals();
					},
					failure : function(response) {
						Ext.Msg.alert('提示', "删除收支信息失败");
					},
					params : {
						strChecked : strChecked
					}
				});
			}
		});
	}

	
	/**
	 * 修改菜单初始化
	 */
	function editInit() {
		var record = grid.getSelectionModel().getSelected();
		//得到多条被选中的记录
		var rows = grid.getSelectionModel().getSelections();
		//查看是否记录得到焦点，如果没有被选中，那么就停止程序！
		if (Ext.isEmpty(record)) 
		{
			Ext.Msg.alert('提示:', '请先选中项目');
			return;
		}
		//当选中多条时不允许同时上传！
		if(rows.length>1)
		{
			Ext.Msg.alert('提示：','不能同时修改多条记录');
			return;
		}
		addMenuFormPanel.getForm().loadRecord(record);
		Ext.getCmp('fjtypeName').setValue(record.data.tp_name);
		addMenuWindow.show();
		addMenuWindow.setTitle('<span style="font-weight:normal">修改项目编号为：'+prj_no+'收支信息</span>');
	}

	/**
	 * 新增菜单初始化
	 */
	function addInit() 
	{
		var selectModel = menuTree.getSelectionModel();
		var selectNode = selectModel.getSelectedNode();
		addMenuFormPanel.getForm().reset();
		Ext.getCmp('fjtypeName').setValue(selectNode.attributes.text);
		Ext.getCmp('attc_tp').setValue(selectNode.attributes.id);
		addMenuWindow.show();
		addMenuWindow.setTitle('<span style="font-weight:normal">新增项目编号为：'+prj_no+'的收支信息</span>');
	}

	
	
	/**
	 * 更新
	 */
	function update() {
		if (!addMenuFormPanel.form.isValid()) 
		{
			return;
		}
		if (runMode == '0') {
			Ext.Msg.alert('提示', '系统正处于演示模式下运行,您的操作被取消!该模式下只能进行查询操作!');
			return;
		}
		var record = grid.getSelectionModel().getSelected();
		addMenuFormPanel.form.submit({
					url : './szglDemo.ered?reqCode=updateShouZhi',
					waitTitle : '提示',
					method : 'POST',
					waitMsg : '正在处理数据,请稍候...',
					success : function(form, action) {
						store.reload();
						Ext.MessageBox.alert('提示', action.result.msg);
						addMenuFormPanel.getForm().reset();
						addMenuWindow.hide();
						//重新统计！
						totals();
					},
					failure : function(form, action) {
						var msg = action.result.msg;
						Ext.MessageBox.alert('提示', '数据修改失败:<br>' + msg);
						addMenuFormPanel.getForm().reset();
					},
					params : {
						detail_sn : record.data.detail_sn
					}
				});
	}
	
	//定义个统计当前记录的所有金额的函数
	function totals()
	{
		var rowIndex = grid.getStore().getCount();//grid的行数 
		var colIndex = grid.getColumnModel().getColumnCount(); //grid的列数 
		//alert('总共有'+rowIndex+'条记录');
		//用于统计当前记录的金额总数！
		var money=0;
		for(var i=0;i<rowIndex;i++)
		{
			var record=grid.getStore().getAt(i); 
			money=money+Number(record.data.detail_money);
		}
		Ext.getCmp('biaoge').setTitle(oldTitle+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当前页<span style='color:red;'>"+rowIndex+"</span>条支出费用共计：<span style='color:red;'>"+money+"元</span>");
	}
});


